/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package system;

import ejb.system.Sessione;
import ejb.system.SessioneFacadeRemote;
import ejb.system.Utente;
import ejb.system.UtenteFacadeRemote;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

/**
 *
 * @author ciummo
 */
public class LoginAction extends DispatchAction {

    /*
     * forward name="success" path=""
     */
    private final static String SUCCESS = "success";
    private final static String FAILURE = "failure";
    
    
    private final static String SUCCESSLOGOUT = "successLogout";
    
    
    
    
    private final static String SUCCESSADMINDIALOG = "successAdminDialog";
    private final static String SUCCESSUSERDIALOG = "successUserDialog";
    

    private Utilities utility = new Utilities();
    

    public ActionForward secureLogin(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        // Ricavo i dati dal form di login
        LoginActionForm userLoginForm = (LoginActionForm) form;


        String username = userLoginForm.getUsername();
        String password = userLoginForm.getPassword();
        String cookies = userLoginForm.getCookies();

        // Controllo se username esiste e la password e' corretta
        VerifyUserPassword cup = new VerifyUserPassword();
        if(!cup.check(username,password)){
            return mapping.findForward(FAILURE);
        }
        
        UtenteFacadeRemote utenteFacade = (UtenteFacadeRemote) utility.callRemoteBean("UtenteFacade/remote");
        Utente utente = utenteFacade.findUtente(username);


        String sessionId = request.getSession(true).getId();//Questo è il codice della sessione
        userLoginForm.setRole(utente.getRuolo());

        SessioneFacadeRemote sessioneFacade = (SessioneFacadeRemote) utility.callRemoteBean("SessioneFacade/remote");

        // Se esiste già una coppia username-sessionId devo eliminarlo!
        
        Sessione sessione = sessioneFacade.findSessione(username);
        
        if (sessione != null) {

            sessioneFacade.remove(sessione);
        }


        //L'utente ha scelto di attivare i cookies!
        if (cookies != null) {
            if (!cookies.equals("false")) {

                //Imposto il cookie con l'id della sessione
                Cookie sessionCookie = new Cookie("DGestSession", request.getRequestedSessionId());
                sessionCookie.setMaxAge(60 * 60 * 24 * 30); // scadenza cookie 30 giorni
                //sessionCookie.setSecure(true);
                response.addCookie(sessionCookie);

                //Imposto il cookie con il nome utente
                Cookie usernameCookie = new Cookie("DGestUsername", username);
                usernameCookie.setMaxAge(60 * 60 * 24 * 30); // scadenza cookie 30 giorni
                //sessionCookie.setSecure(true);
                response.addCookie(usernameCookie);

                //Creo le chiavi sul database!
                sessione = new Sessione(sessionId, username);
                sessioneFacade.create(sessione);
            }
        }

        //TODO : UTENTE NULL
        
        
        //ADMIN DIALOG
        if (utente.getRuolo().equalsIgnoreCase("Admin Dialog")) {

            
            return mapping.findForward(SUCCESSADMINDIALOG);
        }
        
        
        //ADDETTO DIALOG
        if (utente.getRuolo().equalsIgnoreCase("Tecnico Dialog")) {
            
            return mapping.findForward(SUCCESSUSERDIALOG);
        }
        
        //TODO : Aggiungere i ruoli
        
        
        //TODO : Rimettere FAILURE
        
        return mapping.findForward(FAILURE);

    }

    public ActionForward checkLogin(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        // Recupero i cookies che mi interessano
        String sessionCookie = null;
        String usernameCookie = null;
        
        Cookie[] cookies = request.getCookies();

        int i = 0;
        
        try {
        
        // Cerco il cookie della sessione
        while (i < cookies.length) {
            if (cookies[i].getName().equals("DGestSession"))break;
  
            i++; 
        }
        }catch(Exception e){
            
            return mapping.findForward(FAILURE);
        }
        // Se è presente me lo metto da parte
        if (i < cookies.length)
            sessionCookie = cookies[i].getValue();   
        else{            
        // Altrimenti rendo FAILURE
            return mapping.findForward(FAILURE);
        } 

        //DOPO AVER TROVATO IL COOKIE DELLA SESSIONE CERCO QUELLO DELL'USERNAME...
        for(i=0; i<cookies.length; i++){
            if (cookies[i].getName().equals("DGestUsername"))break;
        }
        usernameCookie=cookies[i].getValue();
        
        if(usernameCookie==null){
            
            //Se non è presente rendo failure
            return mapping.findForward(FAILURE);
        }
        
        SessioneFacadeRemote sessioneFacade = (SessioneFacadeRemote) utility.callRemoteBean("SessioneFacade/remote");
        
        
        //Recupera dal database (se esiste) i valori accoppiati USERNAME-SESSIONiD
        Sessione sessione = sessioneFacade.find(sessionCookie);
        
        //Caso in cui l'utente abbia i cookies salvati, ma nel server siano stati cancellati
        if(sessione==null){
            
            return mapping.findForward(FAILURE);
        }
        
        
        UtenteFacadeRemote utenteFacade = (UtenteFacadeRemote) utility.callRemoteBean("UtenteFacade/remote");
        
        if(sessione.getIdSessione().equals(sessionCookie)){    
            
            //Ricavo il bean dell'utente
            
            Utente utente = utenteFacade.findUtente(sessione.getUsername());
                        
            // se null vuol dire che non è iscritto...            
            if(utente==null){
                return mapping.findForward(FAILURE);
            }
            
            LoginActionForm loginForm = new LoginActionForm (utente.getUsername(), utente.getPassword(), utente.getRuolo(), sessionCookie);
            
            HttpSession httpSession = request.getSession();            
            httpSession.setAttribute("LoginActionForm", loginForm);  
            
            
            if(loginForm.getRole().equals("Admin Dialog")){
                
                return mapping.findForward(SUCCESSADMINDIALOG);
            }
            
        
            if (loginForm.getRole().equals("Tecnico Dialog")) {
   
                return mapping.findForward(SUCCESSUSERDIALOG);
            }            
            
            //TODO : FAILURE
                    
        }
        
        return mapping.findForward(FAILURE);
    }
    
    public ActionForward secureLogout(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        HttpSession session = request.getSession(true);
        session.invalidate();
        
       Cookie sessionCookie = new Cookie("DGestSession", null);
       sessionCookie.setMaxAge(0); 
       response.addCookie(sessionCookie);
            
       Cookie usernameCookie = new Cookie("DGestUsername", null);
       usernameCookie.setMaxAge(0);
       response.addCookie(usernameCookie);
        
        
        return mapping.findForward(SUCCESSLOGOUT);
    }
    

}
